package simulator.processes;
/**
 * Trida tvorici zaklad vsech procesu pro tridu <code>Scheduler</code>.
 */
public abstract class Process implements Comparable<Process> {

	private int id;
	private int wakeTime;
	private ProcessListener listener = null;
	private Scheduler scheduler;
	
	/**
	 * Vrati referenci na planovac, pod ktery proces spada.
	 * @return Reference planovace.
	 */
	public Scheduler getScheduler() {
		return scheduler;
	}
	
	/**
	 * Nastavi referenci planovac, pod ktery proces spada.
	 * @param scheduler Planovac prirazeny procesu.
	 */
	void setScheduler(Scheduler scheduler) {
		this.scheduler = scheduler;
	}


	/**
	 * Vrati cas buzeni procesu v absolutni hodnote, tzn. od pocatku simulace.
	 * @return
	 */
	public int getWakeTime() {
		return wakeTime;
	}
	
	/**
	 * Nastavi cas buzeni. Tento cas je v absolutni hodnote, tedy od pocatku simulace.
	 * @param l
	 */
	public void setWakeTime(int l) {
		this.wakeTime = l;
	}
	
	/**
	 * Vrati referenci na listener procesu. 
	 * @return
	 */
	public ProcessListener getListener() {
		return listener;
	}

	/**
	 * Priradi objekt jako listener procesu.
	 * @param listener Objekt, ktery implementuje rozhrani ProcessListener.
	 */
	public void setListener(ProcessListener listener) {
		this.listener = listener;
	}

	/**
	 * Metoda, ktera se provede pri zpracovani procesu.
	 */
	protected abstract void process();
	
	/**
	 * Metoda oznacujici proces jako dokonceny.
	 */
	protected void notifyProcessed() {
		if(listener != null)
			listener.onProcessProcessed(this);
	}
	
	/**
	 * Metoda oznacujici proces jako aktualizovany - napriklad prechod do jineho stavu.
	 */
	protected void notifyUpdated() {
		if(listener != null)
			listener.onProcessUpdated(this);
	}
	
	@Override
	public int compareTo(Process o) {
		return this.getWakeTime() - o.getWakeTime();
	}

	/**
	 * Nastavi identifikator procesu.
	 * @param id Identifikator procesu.
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Vrati hodnotu identifikatoru procesu.
	 * @return Hodnota identifikatoru procesu.
	 */
	public int getId() {
		return id;
	}
	
}
